﻿using System;
using System.Text;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Globalization;
using AudiPyme.BLL;
using System.IO;
using System.Data;
using AudiPyme.DAL;
using System.Web.UI.DataVisualization;
using System.Web.UI.DataVisualization.Charting;
using System.Drawing;
using System.Web.UI.HtmlControls;


namespace AudiPyme.UI
{
    public partial class RelacionesPrincipal : System.Web.UI.Page
    {

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!this.IsPostBack)
            {
                try
                {
                    //Recogemos el nombre de usuario que inicio la sesión y su empresa asociada
                    String NombreUsuario = (String)Session["nombreUsuario"];
                    int EmpresaUsuario = UsuariosFactory.EmpresaUsuario(NombreUsuario);
                    if (EmpresaUsuario != 0)
                    {
                        //Se muestra en un gráfico la disposición de las relaciones tipo activo - amenaza - criterio de riesgo seleccionadas por una empresa por tipo de activo
                        int numeroActivosEmpresa = ActivosEmpresaFactory.NumeroTotalesActivosEmpresa(EmpresaUsuario);
                        int numRelTipAmenCrit = InstanciaTiposActivosAmenazasCriteriosRiesgoFactory.NumRelacTipAmenCritEmpresa(EmpresaUsuario);
                        int numRelTipVuln = InstanciaTiposActivosVulnerabilidadesFactory.NumRelacTipActVuln(EmpresaUsuario);
                        int numRelacionesTotales = numRelTipAmenCrit + numRelTipVuln;
                        if (numeroActivosEmpresa == 0)
                            MuestraMensaje("La Empresa no tiene activos a los cuales asociar relaciones. Añada activos en la Base de Datos antes");
                        GeneraOpciones(numeroActivosEmpresa, numRelTipAmenCrit, numRelTipVuln);
                        if (numRelacionesTotales != 0)
                        {
                            PanelOpcClasif.Visible = true;
                            PanelChart.Visible = true;
                            if (numRelTipAmenCrit != 0)
                                PintaChart("Amenazas");
                            else
                                PintaChart("Vulnerabilidades");
                        }
                        else
                        {
                            MuestraMensaje("No hay relaciones asociadas a los activos.\nSe debe añadir relaciones para cada tipo de activo antes de poder generar el informe.");
                        }
                    }
                    else
                    {
                        MuestraMensaje("No hay una empresa asociada al usuario " + NombreUsuario);
                    }
                }
                catch (Exception e1)
                {
                    e1.ToString();
                    MuestraMensaje("Error al cargar la página");
                }
            }
        }

        private void GeneraOpciones(int numeroActivosEmpresa, int numRelTipAmenCrit, int numRelTipVuln)
        {
            try
            {
                //Si la Empresa tiene activos
                if (numeroActivosEmpresa != 0)
                {
                    //Añado las opciones de Añadir Relaaciones
                    HtmlGenericControl opc1 = new HtmlGenericControl("li");
                    ListaOpciones.Controls.Add(opc1);
                    HtmlGenericControl anchor = new HtmlGenericControl("a");
                    anchor.Attributes.Add("href", "RelacionesAddTipActAmenCritRies.aspx");
                    anchor.InnerText = "Añadir Tipo Activo - Amenaza - Criterio Riesgo";
                    opc1.Controls.Add(anchor);
                    HtmlGenericControl opc2 = new HtmlGenericControl("li");
                    ListaOpciones.Controls.Add(opc2);
                    HtmlGenericControl anchor2 = new HtmlGenericControl("a");
                    anchor2.Attributes.Add("href", "RelacionesAddTipActVuln.aspx");
                    anchor2.InnerText = "Añadir Tipo Activo - Vulnerabilidad";
                    opc2.Controls.Add(anchor2);
                }
                //Añado la relación Gestionar Relaciones Tipo Activo - Amenaza - Criterio Riesgo si existen 
                //relaciones de ese tipo en la empresa
                if (numRelTipAmenCrit != 0)
                {
                    //Añade la opcion de gestionar relaciones
                    HtmlGenericControl opc1 = new HtmlGenericControl("li");
                    ListaOpciones.Controls.Add(opc1);
                    HtmlGenericControl anchor = new HtmlGenericControl("a");
                    anchor.Attributes.Add("href", "RelacionesGestTipActAmenCrit.aspx");
                    anchor.InnerText = "Gestionar Tipo Activo - Amenaza - Criterio Riesgo";
                    opc1.Controls.Add(anchor);
                }
                //Añado la relación Gestionar Relaciones Tipo Activo - Vulnerabilidad si existen 
                //relaciones de ese tipo en la empresa
                if (numRelTipVuln != 0)
                {
                    //Añade la opcion de gestionar relaciones
                    HtmlGenericControl opc1 = new HtmlGenericControl("li");
                    ListaOpciones.Controls.Add(opc1);
                    HtmlGenericControl anchor = new HtmlGenericControl("a");
                    anchor.Attributes.Add("href", "RelacionesGestTipActVuln.aspx");
                    anchor.InnerText = "Gestionar Tipo Activo - Vulnerabilidad";
                    opc1.Controls.Add(anchor);
                }
            }
            catch (Exception e1)
            {
                e1.ToString();
                MuestraMensaje("Error al generar las opciones de la página\n");
            }

        }

        //Método que muestra la información elegida en un chart
        private void PintaChart(String opcion)
        {
            try
            {
                //Recogemos la empresa asociada al usuario que inició la sesión
                String NombreUsuario = (String)Session["nombreUsuario"];
                int EmpresaUsuario = UsuariosFactory.EmpresaUsuario(NombreUsuario);
                //Seteamos el chart a visible por si venimos de una condición de error
                Chart1.Visible = true;
                switch (opcion)
                {
                    //Dependiendo de la opcion elegida en el DropDownList, el Chart mostrará las relaciones 
                    //agrupados según el criterio seleccionado
                    case "Amenazas":
                        LblAmenVuln.Text = "Amenazas";
                        //Recogemos las relaciones Tipo Activo-Amenaza-Criterio de Riesgo seleccionadas por la empresa agrupadas por Tipo de Activo
                        List<String> TiposActivosEmpr = InstanciaTiposActivosAmenazasCriteriosRiesgoFactory.ListaTiposActivosAmenEmpresa(EmpresaUsuario);
                        List<int> NumRelTipActEmp = InstanciaTiposActivosAmenazasCriteriosRiesgoFactory.ListaNumTipActivAmenEmpr(EmpresaUsuario);
                        if (NumRelTipActEmp.Count() != 0)
                        {
                            PanelChart.Visible = true;
                            //Pintamos el chart con los datos recogidos
                            for (int i = 0; i < TiposActivosEmpr.Count(); i++)
                            {
                                Chart1.Series["Series1"].Points.AddXY(TiposActivosEmpr[i], NumRelTipActEmp[i]);
                            }
                            this.Chart1.Series["Series1"].ToolTip = "Número de Relaciones Tipo Activo-Amenaza con Tipo Activo #AXISLABEL : #VALY. Pinche aquí para verlos";
                        }
                        else
                        {
                            MuestraMensaje("No hay relaciones Tipo Activo-Amenaza creadas para la empresa");
                            PanelChart.Visible = false;
                        }
                        break;
                    case "Vulnerabilidades":
                        LblAmenVuln.Text = "Vulnerabilidades";
                        //Recogemos las relaciones Tipo Activo-Vulnerabildiad seleccionadas por la empresa agrupadas por Tipo de Activo
                        List<String> TiposActivosVulnEmpr = InstanciaTiposActivosVulnerabilidadesFactory.ListaTiposActivosVulnEmpresa(EmpresaUsuario);
                        List<int> NumRelTipActVulnEmp = InstanciaTiposActivosVulnerabilidadesFactory.ListaNumTipActivVulnEmpr(EmpresaUsuario);
                        if (NumRelTipActVulnEmp.Count() != 0)
                        {
                            PanelChart.Visible = true;
                            //Pintamos el chart con los datos recogidos
                            for (int i = 0; i < TiposActivosVulnEmpr.Count(); i++)
                            {
                                Chart1.Series["Series1"].Points.AddXY(TiposActivosVulnEmpr[i], NumRelTipActVulnEmp[i]);
                            }
                            this.Chart1.Series["Series1"].ToolTip = "Número de Relaciones Tipo Activo-Vulnerabilidad con Tipo Activo #AXISLABEL : #VALY. Pinche aquí para verlos";
                        }
                        else
                        {
                            MuestraMensaje("No hay relaciones Tipo Activo-Vulnerabilidad creadas para la empresa");
                            PanelChart.Visible = false;
                        }
                        break;
                }
                //Aplicamos transparencia a las barras del chart
                Chart1.ApplyPaletteColors();
                foreach (var serie in Chart1.Series)
                {
                    serie.Color = Color.FromArgb(220, serie.Color);
                }
                UpdatePanel2.Update();
            }
            catch (Exception e1)
            {
                e1.ToString();
                MuestraMensaje("Error al actualizar el gráfico");
            }

        }

        //Método para mostrar una ventana de información
        protected void MuestraMensaje(string Mensaje)
        {
            StringBuilder SB = new StringBuilder();
            SB.Append("alert('");
            SB.Append(Mensaje.Replace("\n", "\\n").Replace("\r", "").Replace("'", "\\'"));
            SB.Append("');");
            ScriptManager.RegisterStartupScript(this.Page, this.GetType(), "showalert", SB.ToString(), true);
        }

        //Método que permite llenar y mostrar el Gridview con las opciones y parámetros elegidos
        private void LlenaGridView(String opcion, String Parametro)
        {
            try
            {
                //Recogemos la empresa asociada al usuario que inició la sesión
                String NombreUsuario = (String)Session["nombreUsuario"];
                int EmpresaUsuario = UsuariosFactory.EmpresaUsuario(NombreUsuario);
                List<RelacTipActAmenVuln> ListaRelaciones = new List<RelacTipActAmenVuln>();
                ModeloContainer agenteBD = new ModeloContainer();
                //Dependiendo de la opcion elegida en el DropDownList y de la barra elegida en el Chart el GridView mostrará las relaciones 
                //agrupadas según la opción seleccionada y filtrados según la barra del Chart elegida
                switch (opcion)
                {
                    case "Amenazas":
                        //Recojo el valor del Tipo de Activo seleccionado en el chart
                        String TipActElegidAmen = LblTipActElegido.Text;
                        if (!opcion.Contains(":"))
                        {
                            LblAmenVuln.Text = LblAmenVuln.Text + ": ";
                        }

                        ListaRelaciones = InstanciaTiposActivosAmenazasCriteriosRiesgoNegocio.ListaAmenazasPorTipoActivoEmpresa(EmpresaUsuario, Parametro);
                        GVRelaciones.DataSource = ListaRelaciones;
                        DataBind();
                        //Ponemos en las cabeceras del GridView que se trata de una Amenaza
                        GVRelaciones.HeaderRow.Cells[2].Text = "IdAm";
                        GVRelaciones.HeaderRow.Cells[3].Text = "Amenaza";
                        break;
                    case "Vulnerabilidades":
                        //Ponemos en las cabeceras del GridView que se trata de una Vulnerabilidad
                        String TipActElegidVuln = LblTipActElegido.Text;
                        if (!opcion.Contains(":"))
                        {
                            LblAmenVuln.Text = LblAmenVuln.Text + ": ";
                        }
                        ListaRelaciones = InstanciaTiposActivosVulnerabilidadesNegocio.ListaVulnPorTipoActivoEmpresa(EmpresaUsuario, Parametro);
                        GVRelaciones.DataSource = ListaRelaciones;
                        DataBind();
                        //Ponemos en las columnas correspondientes del GridView que se trata de una Amenaza
                        GVRelaciones.HeaderRow.Cells[2].Text = "IdVul";
                        GVRelaciones.HeaderRow.Cells[3].Text = "Vulnerabilidad";
                        break;
                }
                UpdatePanel3.Update();
            }
            catch (Exception e1)
            {
                e1.ToString();
                MuestraMensaje("Error al actualizar los valores de la tabla");
            }
        }

        //Evento que nos permite cambiar las cabeceras del GridView según hayamos elegido una relación de Amenaza o Vulnerabilidad
        protected void GVRelaciones_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.Header)
            {
                e.Row.Cells[0].ToolTip = "Id del Tipo de Activo seleccionado";
                e.Row.Cells[1].ToolTip = "Nombre del Tipo de Activo seleccionado";
                //Recogemos la opción seleccionada
                string opcion = DdlAmenVuln.SelectedValue;
                if (opcion.Equals("Amenazas"))
                {
                    e.Row.Cells[2].ToolTip = "Id de la Amenaza en la Relación asociada al Tipo de Activo seleccionado";
                    e.Row.Cells[3].ToolTip = "Nombre de la Amenaza en la Relación asociada al Tipo de Activo seleccionado";
                }
                //Sino es que se ha seleccionado una Vulnerabilidad
                else
                {
                    e.Row.Cells[2].ToolTip = "Id de la Vulnerabilida en la Relación asociada al Tipo de Activo seleccionado";
                    e.Row.Cells[3].ToolTip = "Nombre de la Vulnerabilidad en la Relación asociada al Tipo de Activo seleccionado";
                }
            }
            UpdatePanel3.Update();
        }

        //Evento que nos permite elegir el tipo de relaciones que queremos mostrar
        protected void DdlAmenVuln_SelectedIndexChanged(object sender, EventArgs e)
        {
            //Recogemos la empresa asociada al usuario que inició la sesión
            String NombreUsuario = (String)Session["nombreUsuario"];
            int EmpresaUsuario = UsuariosFactory.EmpresaUsuario(NombreUsuario);
            String opcion = DdlAmenVuln.SelectedValue;
            LblAmenVuln.Text = opcion;
            LblTipActElegido.Text = "";
            //Bindeamos el GridView a null para que si saltamos de clasificación no se nos muestre el GV anterior
            GVRelaciones.DataSource = null;
            DataBind();
            UpdatePanel3.Update();
            //Pintamos el Chart con la opción elegida
            PintaChart(opcion);
        }

        //Evento que recoge la columna seleccionada en el Chart
        protected void Chart1_Click(object sender, ImageMapEventArgs e)
        {
            //Recogemos la opción elegida en el DropDownList
            String opcion = DdlAmenVuln.SelectedValue;
            //Si hubiera una fila seleccionada para editar la deseleccionamos
            GVRelaciones.EditIndex = -1;
            //Recogemos el valor seleccionados en el chart
            String Parametro = e.PostBackValue;
            LblTipActElegido.Text = Parametro;
            PintaChart(opcion);
            LlenaGridView(opcion, Parametro);
        }

        //Evento que se desencadena al aceptar el mensaje de confirmación después de pulsar en el botón
        //Eliminar sobre una relación determinada
        protected void GVRelaciones_RowDeleting(object sender, GridViewDeleteEventArgs e)
        {
            try
            {
                //Recogemos la empresa asociada al usuario que inició la sesión
                String NombreUsuario = (String)Session["nombreUsuario"];
                int EmpresaUsuario = UsuariosFactory.EmpresaUsuario(NombreUsuario);
                //Recogemos la opción de tipo de relación seleccionada
                String opcion = DdlAmenVuln.SelectedValue;
                int IdAmenaza, IdVulnerabilidad;
                //Recogemos el Id del Tipo Activo de la relación seleccionado para Eliminar
                int IdTipActivo = (int)int.Parse(GVRelaciones.Rows[e.RowIndex].Cells[0].Text);
                if (opcion.Equals("Amenazas"))
                {
                    //Recogemos el Id de la Amenaza de la relación seleccionada para Eliminar
                    IdAmenaza = int.Parse(GVRelaciones.Rows[e.RowIndex].Cells[2].Text);
                    InstanciaTiposActivosAmenazasCriteriosRiesgoFactory.EliminarInstanciaTipActAmenCrit(EmpresaUsuario, IdTipActivo, IdAmenaza);
                    MuestraMensaje("La Relación Tipo Activo-Amenaza ha sido eliminada correctamente");
                }
                //Caso Vulnerabilidades
                else
                {
                    //Recogemos el Id de la Vulnerabilidad de la relación seleccionada para Eliminar
                    IdVulnerabilidad = int.Parse(GVRelaciones.Rows[e.RowIndex].Cells[2].Text);
                    InstanciaTiposActivosVulnerabilidadesFactory.EliminarInstanciaTipActVuln(EmpresaUsuario, IdTipActivo, IdVulnerabilidad);
                    MuestraMensaje("La Relación Tipo Activo-Vulnerabilidad ha sido eliminada correctamente");
                }
                //Recargamos el Gridview y el Chart con los nuevos cambios
                String Parametro = LblTipActElegido.Text;
                PintaChart(opcion);
                LlenaGridView(opcion, Parametro);
            }
            catch (Exception e1)
            {
                e1.ToString();
                MuestraMensaje("Error al eliminar las relaciones");
            }
        }

        protected void GVRelaciones_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {
            try
            {
                //Recogemos la empresa asociada al usuario que inició la sesión
                String NombreUsuario = (String)Session["nombreUsuario"];
                int EmpresaUsuario = UsuariosFactory.EmpresaUsuario(NombreUsuario);
                this.GVRelaciones.PageIndex = e.NewPageIndex;
                //Recogemos la opción elegida en el DropDownList
                String opcion = DdlAmenVuln.SelectedValue;
                //Si hubiera una fila seleccionada para editar la deseleccionamos
                GVRelaciones.EditIndex = -1;
                //Recogemos el valor seleccionados en el chart
                String Parametro = LblTipActElegido.Text;
                LblTipActElegido.Text = Parametro;
                //PintaChart(opcion);
                LlenaGridView(opcion, Parametro);
            }
            catch (Exception e1)
            {
                e1.ToString();
                MuestraMensaje("Error al actualizar la página de la tabla");
            }
        }

        protected void DdlAmenVuln_Load(object sender, EventArgs e)
        {
            try
            {
                if (!this.IsPostBack)
                {
                    //Recogemos el nombre de usuario que inicio la sesión y su empresa asociada
                    String NombreUsuario = (String)Session["nombreUsuario"];
                    int EmpresaUsuario = UsuariosFactory.EmpresaUsuario(NombreUsuario);
                    int numRelTipAmenCrit = InstanciaTiposActivosAmenazasCriteriosRiesgoFactory.NumRelacTipAmenCritEmpresa(EmpresaUsuario);
                    int numRelTipVuln = InstanciaTiposActivosVulnerabilidadesFactory.NumRelacTipActVuln(EmpresaUsuario);
                    DdlAmenVuln.Items.Clear();
                    if (numRelTipAmenCrit != 0)
                    {
                        ListItem LAmenazas = new ListItem("Amenazas", "Amenazas");
                        DdlAmenVuln.Items.Add(LAmenazas);
                        if (numRelTipVuln == 0)
                        {
                            DdlAmenVuln.SelectedValue = "Amenazas";
                        }

                    }
                    if (numRelTipVuln != 0)
                    {
                        ListItem LVulnerabilidades = new ListItem("Vulnerabilidades", "Vulnerabilidades");
                        DdlAmenVuln.Items.Add(LVulnerabilidades);
                        if (numRelTipAmenCrit == 0)
                        {
                            DdlAmenVuln.SelectedValue = "Vulnerabilidades";
                        }
                    }
                }
            }
            catch (Exception e1)
            {
                e1.ToString();
                MuestraMensaje("Error al cargar el selector de tipo de relaciones");
            }
        }
    }
}